package com.yitiao.data_algorithms.structure.queue;

import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
public class DelayQueueExample {
    public static void main(String[] args) throws InterruptedException {
        // 创建 DelayQueue 队列
        DelayQueue<DelayedTask> queue = new DelayQueue<>();
        // 向 DelayQueue 中添加任务
        queue.add(new DelayedTask(5, "Task1"));
        queue.add(new DelayedTask(1, "Task2"));
        queue.add(new DelayedTask(2, "Task3"));
        // 循环从 DelayQueue 中获取任务并执行
        while (!queue.isEmpty()) {
            DelayedTask task = queue.take();
            System.out.println("执行任务：" + task);
        }
    }
    /**
     * 自定义延迟任务实现 Delayed 接口
     */
    static class DelayedTask implements Delayed {
        private final long endTime; // 延迟结束时间
        private final String name; // 任务名称
        public DelayedTask(long delay, String name) {
            this.endTime = System.currentTimeMillis() + delay * 1000;
            this.name = name;
        }
        /**
         * 获取延迟时间
         */
        @Override
        public long getDelay(TimeUnit unit) {
            return unit.convert(endTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
        }
        /**
         * 定义 DelayedTask 的比较方式，用于排序
         */
        @Override
        public int compareTo(Delayed o) {
            return Long.compare(endTime, ((DelayedTask) o).endTime);
        }
        @Override
        public String toString() {
            return name;
        }
    }
}
